home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / var / lib / dpkg / info / x11-common.postinst < prev    next >
Text File  |  2008-10-24  |  36KB  |  1,076 lines

  1. #!/bin/sh
  2. # Debian x11-common package post-installation script
  3. # Copyright 1998--2001, 2003 Branden Robinson.
  4. # Licensed under the GNU General Public License, version 2.  See the file
  5. # /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
  6. # Acknowlegements to Stephen Early, Mark Eichin, and Manoj Srivastava.
  7.  
  8. set -e
  9.  
  10. . /usr/share/debconf/confmodule
  11.  
  12. THIS_PACKAGE=x11-common
  13. THIS_SCRIPT=postinst
  14. CONFIG_DIR=/etc/X11
  15. XWRAPPER_CONFIG="$CONFIG_DIR/Xwrapper.config"
  16. CONFIG_AUX_DIR=/var/lib/x11
  17. XWRAPPER_CONFIG_CHECKSUM_BASE="${XWRAPPER_CONFIG##*/}.md5sum"
  18. XWRAPPER_CONFIG_CHECKSUM="$CONFIG_AUX_DIR/$XWRAPPER_CONFIG_CHECKSUM_BASE"
  19. XWRAPPER_CONFIG_ROSTER_BASE="${XWRAPPER_CONFIG##*/}.roster"
  20. XWRAPPER_CONFIG_ROSTER="$CONFIG_AUX_DIR/$XWRAPPER_CONFIG_ROSTER_BASE"
  21.  
  22. # $Id$
  23.  
  24. # This is the X Strike Force shell library for X Window System package
  25. # maintainer scripts.  It serves to define shell functions commonly used by
  26. # such packages, and performs some error checking necessary for proper operation
  27. # of those functions.  By itself, it does not "do" much; the maintainer scripts
  28. # invoke the functions defined here to accomplish package installation and
  29. # removal tasks.
  30.  
  31. # If you are reading this within a Debian package maintainer script (e.g.,
  32. # /var/lib/dpkg)info/PACKAGE.{config,preinst,postinst,prerm,postrm}), you can
  33. # skip past this library by scanning forward in this file to the string
  34. # "GOBSTOPPER".
  35.  
  36. SOURCE_VERSION=1:7.4~5ubuntu3
  37. OFFICIAL_BUILD=
  38.  
  39. # Use special abnormal exit codes so that problems with this library are more
  40. # easily tracked down.
  41. SHELL_LIB_INTERNAL_ERROR=86
  42. SHELL_LIB_THROWN_ERROR=74
  43. SHELL_LIB_USAGE_ERROR=99
  44.  
  45. # old -> new variable names
  46. if [ -z "$DEBUG_XORG_PACKAGE" ] && [ -n "$DEBUG_XFREE86_PACKAGE" ]; then
  47.   DEBUG_XORG_PACKAGE="$DEBUG_XFREE86_PACKAGE"
  48. fi
  49. if [ -z "$DEBUG_XORG_DEBCONF" ] && [ -n "$DEBUG_XFREE86_DEBCONF" ]; then
  50.   DEBUG_XORG_DEBCONF="$DEBUG_XFREE86_DEBCONF"
  51. fi
  52.  
  53. # initial sanity checks
  54. if [ -z "$THIS_PACKAGE" ]; then
  55.   cat >&2 <<EOF
  56. Error: package maintainer script attempted to use shell library without
  57. definining \$THIS_PACKAGE shell variable.  Please report the package name,
  58. version, and the text of this error message to the Debian Bug Tracking System.
  59. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  60. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  61. "doc-debian" package, or install the "reportbug" package and use the command of
  62. the same name to file a report against version $SOURCE_VERSION of this package.
  63. EOF
  64.   exit $SHELL_LIB_USAGE_ERROR
  65. fi
  66.  
  67. if [ -z "$THIS_SCRIPT" ]; then
  68.   cat >&2 <<EOF
  69. Error: package maintainer script attempted to use shell library without
  70. definining \$THIS_SCRIPT shell variable.  Please report the package name,
  71. version, and the text of this error message to the Debian Bug Tracking System.
  72. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  73. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  74. "doc-debian" package, or install the "reportbug" package and use the command of
  75. the same name to file a report against version $SOURCE_VERSION of the
  76. "$THIS_PACKAGE" package.
  77. EOF
  78.   exit $SHELL_LIB_USAGE_ERROR
  79. fi
  80.  
  81. ARCHITECTURE="$(dpkg --print-installation-architecture)"
  82.  
  83. if [ "$1" = "reconfigure" ] || [ -n "$DEBCONF_RECONFIGURE" ]; then
  84.   RECONFIGURE="true"
  85. else
  86.   RECONFIGURE=
  87. fi
  88.  
  89. if ([ "$1" = "install" ] || [ "$1" = "configure" ]) && [ -z "$2" ]; then
  90.   FIRSTINST="yes"
  91. fi
  92.  
  93. if [ -z "$RECONFIGURE" ] && [ -z "$FIRSTINST" ]; then
  94.   UPGRADE="yes"
  95. fi
  96.  
  97. trap "message;\
  98.       message \"Received signal.  Aborting $THIS_PACKAGE package $THIS_SCRIPT script.\";\
  99.       message;\
  100.       exit 1" HUP INT QUIT TERM
  101.  
  102. reject_nondigits () {
  103.   # syntax: reject_nondigits [ operand ... ]
  104.   #
  105.   # scan operands (typically shell variables whose values cannot be trusted) for
  106.   # characters other than decimal digits and barf if any are found
  107.   while [ -n "$1" ]; do
  108.     # does the operand contain anything but digits?
  109.     if ! expr "$1" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  110.       # can't use die(), because it wraps message() which wraps this function
  111.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_nondigits() encountered" \
  112.            "possibly malicious garbage \"$1\"" >&2
  113.       exit $SHELL_LIB_THROWN_ERROR
  114.     fi
  115.     shift
  116.   done
  117. }
  118.  
  119. reject_whitespace () {
  120.   # syntax: reject_whitespace [ operand ]
  121.   #
  122.   # scan operand (typically a shell variable whose value cannot be trusted) for
  123.   # whitespace characters and barf if any are found
  124.   if [ -n "$1" ]; then
  125.     # does the operand contain any whitespace?
  126.     if expr "$1" : "[[:space:]]" > /dev/null 2>&1; then
  127.       # can't use die(), because I want to avoid forward references
  128.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_whitespace() encountered" \
  129.            "possibly malicious garbage \"$1\"" >&2
  130.       exit $SHELL_LIB_THROWN_ERROR
  131.     fi
  132.   fi
  133. }
  134.  
  135. reject_unlikely_path_chars () {
  136.   # syntax: reject_unlikely_path_chars [ operand ... ]
  137.   #
  138.   # scan operands (typically shell variables whose values cannot be trusted) for
  139.   # characters unlikely to be seen in a path and which the shell might
  140.   # interpret and barf if any are found
  141.   while [ -n "$1" ]; do
  142.     # does the operand contain any funny characters?
  143.     if expr "$1" : '.*[!$&()*;<>?|].*' > /dev/null 2>&1; then
  144.       # can't use die(), because I want to avoid forward references
  145.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_unlikely_path_chars()" \
  146.            "encountered possibly malicious garbage \"$1\"" >&2
  147.       exit $SHELL_LIB_THROWN_ERROR
  148.     fi
  149.     shift
  150.   done
  151. }
  152.  
  153. # Query the terminal to establish a default number of columns to use for
  154. # displaying messages to the user.  This is used only as a fallback in the
  155. # event the COLUMNS variable is not set.  ($COLUMNS can react to SIGWINCH while
  156. # the script is running, and this cannot, only being calculated once.)
  157. DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true
  158. if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  159.   DEFCOLUMNS=80
  160. fi
  161.  
  162. message () {
  163.   # pretty-print messages of arbitrary length
  164.   reject_nondigits "$COLUMNS"
  165.   echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2
  166. }
  167.  
  168. observe () {
  169.   # syntax: observe message ...
  170.   #
  171.   # issue observational message suitable for logging someday when support for
  172.   # it exists in dpkg
  173.   if [ -n "$DEBUG_XORG_PACKAGE" ]; then
  174.     message "$THIS_PACKAGE $THIS_SCRIPT note: $*"
  175.   fi
  176. }
  177.  
  178. warn () {
  179.   # syntax: warn message ...
  180.   #
  181.   # issue warning message suitable for logging someday when support for
  182.   # it exists in dpkg; also send to standard error
  183.   message "$THIS_PACKAGE $THIS_SCRIPT warning: $*"
  184. }
  185.  
  186. die () {
  187.   # syntax: die message ...
  188.   #
  189.   # exit script with error message
  190.   message "$THIS_PACKAGE $THIS_SCRIPT error: $*"
  191.   exit $SHELL_LIB_THROWN_ERROR
  192. }
  193.  
  194. internal_error () {
  195.   # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
  196.   message "internal error: $*"
  197.   if [ -n "$OFFICIAL_BUILD" ]; then
  198.     message "Please report a bug in the $THIS_SCRIPT script of the" \
  199.             "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  200.             "Tracking System.  Include all messages above that mention the" \
  201.             "$THIS_PACKAGE package.  Visit " \
  202.             "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  203.             "instructions, read the file" \
  204.             "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  205.             "package, or install the reportbug package and use the command of" \
  206.             "the same name to file a report."
  207.   fi
  208.   exit $SHELL_LIB_INTERNAL_ERROR
  209. }
  210.  
  211. usage_error () {
  212.   message "usage error: $*"
  213.   message "Please report a bug in the $THIS_SCRIPT script of the" \
  214.           "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  215.           "Tracking System.  Include all messages above that mention the" \
  216.           "$THIS_PACKAGE package.  Visit " \
  217.           "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  218.           "instructions, read the file" \
  219.           "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  220.           "package, or install the reportbug package and use the command of" \
  221.           "the same name to file a report."
  222.   exit $SHELL_LIB_USAGE_ERROR
  223. }
  224.  
  225.  
  226. maplink () {
  227.   # returns what symlink should point to; i.e., what the "sane" answer is
  228.   # Keep this in sync with the debian/*.links files.
  229.   # This is only needed for symlinks to directories.
  230.   #
  231.   # XXX: Most of these look wrong in the X11R7 world and need to be fixed.
  232.   # If we've stopped using this function, fixing it might enable us to re-enable
  233.   # it again and catch more errors.
  234.   case "$1" in
  235.     /etc/X11/xkb/compiled) echo /var/lib/xkb ;;
  236.     /etc/X11/xkb/xkbcomp) echo /usr/X11R6/bin/xkbcomp ;;
  237.     /usr/X11R6/lib/X11/app-defaults) echo /etc/X11/app-defaults ;;
  238.     /usr/X11R6/lib/X11/fs) echo /etc/X11/fs ;;
  239.     /usr/X11R6/lib/X11/lbxproxy) echo /etc/X11/lbxproxy ;;
  240.     /usr/X11R6/lib/X11/proxymngr) echo /etc/X11/proxymngr ;;
  241.     /usr/X11R6/lib/X11/rstart) echo /etc/X11/rstart ;;
  242.     /usr/X11R6/lib/X11/twm) echo /etc/X11/twm ;;
  243.     /usr/X11R6/lib/X11/xdm) echo /etc/X11/xdm ;;
  244.     /usr/X11R6/lib/X11/xinit) echo /etc/X11/xinit ;;
  245.     /usr/X11R6/lib/X11/xkb) echo /etc/X11/xkb ;;
  246.     /usr/X11R6/lib/X11/xserver) echo /etc/X11/xserver ;;
  247.     /usr/X11R6/lib/X11/xsm) echo /etc/X11/xsm ;;
  248.     /usr/bin/X11) echo ../X11R6/bin ;;
  249.     /usr/bin/rstartd) echo ../X11R6/bin/rstartd ;;
  250.     /usr/include/X11) echo ../X11R6/include/X11 ;;
  251.     /usr/lib/X11) echo ../X11R6/lib/X11 ;;
  252.     *) internal_error "maplink() called with unknown path \"$1\"" ;;
  253.   esac
  254. }
  255.  
  256. analyze_path () {
  257.   # given a supplied set of pathnames, break each one up by directory and do an
  258.   # ls -dl on each component, cumulatively; i.e.
  259.   # analyze_path /usr/X11R6/bin -> ls -dl /usr /usr/X11R6 /usr/X11R6/bin
  260.   # Thanks to Randolph Chung for this clever hack.
  261.  
  262.   local f g
  263.  
  264.   while [ -n "$1" ]; do
  265.     reject_whitespace "$1"
  266.     g=
  267.     message "Analyzing $1:"
  268.     for f in $(echo "$1" | tr / \  ); do
  269.       if [ -e /$g$f ]; then
  270.         ls -dl /$g$f /$g$f.dpkg-* 2> /dev/null || true
  271.         g=$g$f/
  272.       else
  273.         message "/$g$f: nonexistent; directory contents of /$g:"
  274.         ls -l /$g
  275.         break
  276.       fi
  277.     done
  278.     shift
  279.   done
  280. }
  281.  
  282. find_culprits () {
  283.   local f p dpkg_info_dir possible_culprits smoking_guns bad_packages package \
  284.     msg
  285.  
  286.   reject_whitespace "$1"
  287.   message "Searching for overlapping packages..."
  288.   dpkg_info_dir=/var/lib/dpkg/info
  289.   if [ -d $dpkg_info_dir ]; then
  290.     if [ "$(echo $dpkg_info_dir/*.list)" != "$dpkg_info_dir/*.list" ]; then
  291.       possible_culprits=$(ls -1 $dpkg_info_dir/*.list | egrep -v \
  292.         "(xbase-clients|x11-common|xfs|xlibs)")
  293.       if [ -n "$possible_culprits" ]; then
  294.         smoking_guns=$(grep -l "$1" $possible_culprits || true)
  295.         if [ -n "$smoking_guns" ]; then
  296.           bad_packages=$(printf "\\n")
  297.           for f in $smoking_guns; do
  298.             # too bad you can't nest parameter expansion voodoo
  299.             p=${f%*.list}      # strip off the trailing ".list"
  300.             package=${p##*/}   # strip off the directories
  301.             bad_packages=$(printf "%s\n%s" "$bad_packages" "$package")
  302.           done
  303.           msg=$(cat <<EOF
  304. The following packages appear to have file overlaps with the X.Org packages;
  305. these packages are either very old, or in violation of Debian Policy.  Try
  306. upgrading each of these packages to the latest available version if possible:
  307. for example, with the command "apt-get install".  If no newer version of a
  308. package is available, you will have to remove it; for example, with the command
  309. "apt-get remove".  If even the latest available version of the package has
  310. this file overlap, please file a bug against that package with the Debian Bug
  311. Tracking System.  You may want to refer the package maintainer to section 12.8
  312. of the Debian Policy manual.
  313. EOF
  314. )
  315.           message "$msg"
  316.           message "The overlapping packages are: $bad_packages"
  317.         else
  318.           message "no overlaps found."
  319.         fi
  320.       fi
  321.     else
  322.       message "cannot search; no matches for $dpkg_info_dir/*.list."
  323.     fi
  324.   else
  325.     message "cannot search; $dpkg_info_dir does not exist."
  326.   fi
  327. }
  328.  
  329. # we require a readlink command or shell function
  330. if ! which readlink > /dev/null 2>&1; then
  331.   message "The readlink command was not found.  Please install version" \
  332.           "1.13.1 or later of the debianutils package."
  333.   readlink () {
  334.     # returns what symlink in $1 actually points to
  335.     perl -e '$l = shift; exit 1 unless -l $l; $r = readlink $l; exit 1 unless $r; print "$r\n"' "$1"
  336.   }
  337. fi
  338.  
  339. check_symlink () {
  340.   # syntax: check_symlink symlink
  341.   #
  342.   # See if specified symlink points where it is supposed to.  Return 0 if it
  343.   # does, and 1 if it does not.
  344.   #
  345.   # Primarily used by check_symlinks_and_warn() and check_symlinks_and_bomb().
  346.  
  347.   local symlink
  348.  
  349.   # validate arguments
  350.   if [ $# -ne 1 ]; then
  351.     usage_error "check_symlink() called with wrong number of arguments;" \
  352.                 "expected 1, got $#"
  353.     exit $SHELL_LIB_USAGE_ERROR
  354.   fi
  355.  
  356.   symlink="$1"
  357.  
  358.   if [ "$(maplink "$symlink")" = "$(readlink "$symlink")" ]; then
  359.     return 0
  360.   else
  361.     return 1
  362.   fi
  363. }
  364.  
  365. check_symlinks_and_warn () {
  366.   # syntax: check_symlinks_and_warn symlink ...
  367.   #
  368.   # For each argument, check for symlink sanity, and warn if it isn't sane.
  369.   #
  370.   # Call this function from a preinst script in the event $1 is "upgrade" or
  371.   # "install".
  372.  
  373.   local errmsg symlink
  374.  
  375.   # validate arguments
  376.   if [ $# -lt 1 ]; then
  377.     usage_error "check_symlinks_and_warn() called with wrong number of" \
  378.                 "arguments; expected at least 1, got $#"
  379.     exit $SHELL_LIB_USAGE_ERROR
  380.   fi
  381.  
  382.   while [ -n "$1" ]; do
  383.     symlink="$1"
  384.     if [ -L "$symlink" ]; then
  385.       if ! check_symlink "$symlink"; then
  386.         observe "$symlink symbolic link points to wrong location" \
  387.                 "$(readlink "$symlink"); removing"
  388.         rm "$symlink"
  389.       fi
  390.     elif [ -e "$symlink" ]; then
  391.       errmsg="$symlink exists and is not a symbolic link; this package cannot"
  392.       errmsg="$errmsg be installed until this"
  393.       if [ -f "$symlink" ]; then
  394.         errmsg="$errmsg file"
  395.       elif [ -d "$symlink" ]; then
  396.         errmsg="$errmsg directory"
  397.       else
  398.         errmsg="$errmsg thing"
  399.       fi
  400.       errmsg="$errmsg is removed"
  401.       die "$errmsg"
  402.     fi
  403.     shift
  404.   done
  405. }
  406.  
  407. check_symlinks_and_bomb () {
  408.   # syntax: check_symlinks_and_bomb symlink ...
  409.   #
  410.   # For each argument, check for symlink sanity, and bomb if it isn't sane.
  411.   #
  412.   # Call this function from a postinst script.
  413.  
  414.   local problem symlink
  415.  
  416.   # validate arguments
  417.   if [ $# -lt 1 ]; then
  418.     usage_error "check_symlinks_and_bomb() called with wrong number of"
  419.                 "arguments; expected at least 1, got $#"
  420.     exit $SHELL_LIB_USAGE_ERROR
  421.   fi
  422.  
  423.   while [ -n "$1" ]; do
  424.     problem=
  425.     symlink="$1"
  426.     if [ -L "$symlink" ]; then
  427.       if ! check_symlink "$symlink"; then
  428.         problem=yes
  429.         warn "$symlink symbolic link points to wrong location" \
  430.              "$(readlink "$symlink")"
  431.       fi
  432.     elif [ -e "$symlink" ]; then
  433.       problem=yes
  434.       warn "$symlink is not a symbolic link"
  435.     else
  436.       problem=yes
  437.       warn "$symlink symbolic link does not exist"
  438.     fi
  439.     if [ -n "$problem" ]; then
  440.       analyze_path "$symlink" "$(readlink "$symlink")"
  441.       find_culprits "$symlink"
  442.       die "bad symbolic links on system"
  443.     fi
  444.     shift
  445.   done
  446. }
  447.  
  448. font_update () {
  449.   # run $UPDATECMDS in $FONTDIRS
  450.  
  451.   local dir cmd shortcmd x_font_dir_prefix
  452.  
  453.   x_font_dir_prefix="/usr/share/fonts/X11"
  454.  
  455.   if [ -z "$UPDATECMDS" ]; then
  456.     usage_error "font_update() called but \$UPDATECMDS not set"
  457.   fi
  458.   if [ -z "$FONTDIRS" ]; then
  459.     usage_error "font_update() called but \$FONTDIRS not set"
  460.   fi
  461.  
  462.   reject_unlikely_path_chars "$UPDATECMDS"
  463.   reject_unlikely_path_chars "$FONTDIRS"
  464.  
  465.   for dir in $FONTDIRS; do
  466.     if [ -d "$x_font_dir_prefix/$dir" ]; then
  467.       for cmd in $UPDATECMDS; do
  468.         if which "$cmd" > /dev/null 2>&1; then
  469.           shortcmd=${cmd##*/}
  470.           observe "running $shortcmd in $dir font directory"
  471.       cmd_opts=
  472.           if [ "$shortcmd" = "update-fonts-alias" ]; then
  473.             cmd_opts=--x11r7-layout
  474.           fi
  475.           if [ "$shortcmd" = "update-fonts-dir" ]; then
  476.             cmd_opts=--x11r7-layout
  477.           fi
  478.           if [ "$shortcmd" = "update-fonts-scale" ]; then
  479.             cmd_opts=--x11r7-layout
  480.           fi
  481.           $cmd $cmd_opts $dir || warn "$cmd $cmd_opts $dir" \
  482.                               "failed; font directory data may not" \
  483.                               "be up to date"
  484.         else
  485.           warn "$cmd not found; not updating corresponding $dir font" \
  486.                "directory data"
  487.         fi
  488.       done
  489.     else
  490.       warn "$dir is not a directory; not updating font directory data"
  491.     fi
  492.   done
  493. }
  494.  
  495. remove_conffile_prepare () {
  496.   # syntax: remove_conffile_prepare filename official_md5sum ...
  497.   #
  498.   # Check a conffile "filename" against a list of canonical MD5 checksums.
  499.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  500.   # operands provided, then prepare the conffile for removal from the system.
  501.   # We defer actual deletion until the package is configured so that we can
  502.   # roll this operation back if package installation fails.
  503.   #
  504.   # Call this function from a preinst script in the event $1 is "upgrade" or
  505.   # "install" and verify $2 to ensure the package is being upgraded from a
  506.   # version (or installed over a version removed-but-not-purged) prior to the
  507.   # one in which the conffile was obsoleted.
  508.  
  509.   local conffile current_checksum
  510.  
  511.   # validate arguments
  512.   if [ $# -lt 2 ]; then
  513.     usage_error "remove_conffile_prepare() called with wrong number of" \
  514.                 "arguments; expected at least 2, got $#"
  515.     exit $SHELL_LIB_USAGE_ERROR
  516.   fi
  517.  
  518.   conffile="$1"
  519.   shift
  520.  
  521.   # does the conffile even exist?
  522.   if [ -e "$conffile" ]; then
  523.     # calculate its checksum
  524.     current_checksum=$(md5sum < "$conffile" | sed 's/[[:space:]].*//')
  525.     # compare it to each supplied checksum
  526.     while [ -n "$1" ]; do
  527.       if [ "$current_checksum" = "$1" ]; then
  528.         # we found a match; move the confffile and stop looking
  529.         observe "preparing obsolete conffile $conffile for removal"
  530.         mv "$conffile" "$conffile.$THIS_PACKAGE-tmp"
  531.         break
  532.       fi
  533.       shift
  534.     done
  535.   fi
  536. }
  537.  
  538. remove_conffile_lookup () {
  539.   # syntax: remove_conffile_lookup package filename
  540.   #
  541.   # Lookup the md5sum of a conffile in dpkg's database, and prepare for removal
  542.   # if it matches the actual file's md5sum.
  543.   #
  544.   # Call this function when you would call remove_conffile_prepare but only
  545.   # want to check against dpkg's status database instead of known checksums.
  546.  
  547.   local package conffile old_md5sum
  548.  
  549.   # validate arguments
  550.   if [ $# -ne 2 ]; then
  551.     usage_error "remove_conffile_lookup() called with wrong number of" \
  552.                 "arguments; expected 1, got $#"
  553.     exit $SHELL_LIB_USAGE_ERROR
  554.   fi
  555.  
  556.   package="$1"
  557.   conffile="$2"
  558.  
  559.   if ! [ -e "$conffile" ]; then
  560.     return
  561.   fi
  562.   old_md5sum="$(dpkg-query -W -f='${Conffiles}' "$package" | \
  563.     awk '{ if (match($0, "^ '"$conffile"' ")) print $2}')"
  564.   if [ -n "$old_md5sum" ]; then
  565.     remove_conffile_prepare "$conffile" "$old_md5sum"
  566.   fi
  567. }
  568.  
  569. remove_conffile_commit () {
  570.   # syntax: remove_conffile_commit filename
  571.   #
  572.   # Complete the removal of a conffile "filename" that has become obsolete.
  573.   #
  574.   # Call this function from a postinst script after having used
  575.   # remove_conffile_prepare() in the preinst.
  576.  
  577.   local conffile
  578.  
  579.   # validate arguments
  580.   if [ $# -ne 1 ]; then
  581.     usage_error "remove_conffile_commit() called with wrong number of" \
  582.                 "arguments; expected 1, got $#"
  583.     exit $SHELL_LIB_USAGE_ERROR
  584.   fi
  585.  
  586.   conffile="$1"
  587.  
  588.   # if the temporary file created by remove_conffile_prepare() exists, remove it
  589.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  590.     observe "committing removal of obsolete conffile $conffile"
  591.     rm "$conffile.$THIS_PACKAGE-tmp"
  592.   fi
  593. }
  594.  
  595. remove_conffile_rollback () {
  596.   # syntax: remove_conffile_rollback filename
  597.   #
  598.   # Roll back the removal of a conffile "filename".
  599.   #
  600.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  601.   # or "abort-install" is  after having used remove_conffile_prepare() in the
  602.   # preinst.
  603.  
  604.   local conffile
  605.  
  606.   # validate arguments
  607.   if [ $# -ne 1 ]; then
  608.     usage_error "remove_conffile_rollback() called with wrong number of" \
  609.                 "arguments; expected 1, got $#"
  610.     exit $SHELL_LIB_USAGE_ERROR
  611.   fi
  612.  
  613.   conffile="$1"
  614.  
  615.   # if the temporary file created by remove_conffile_prepare() exists, move it
  616.   # back
  617.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  618.     observe "rolling back removal of obsolete conffile $conffile"
  619.     mv "$conffile.$THIS_PACKAGE-tmp" "$conffile"
  620.   fi
  621. }
  622.  
  623. replace_conffile_with_symlink_prepare () {
  624.   # syntax: replace_conffile_with_symlink_prepare oldfilename newfilename \
  625.   # official_md5sum ...
  626.   #
  627.   # Check a conffile "oldfilename" against a list of canonical MD5 checksums.
  628.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  629.   # operands provided, then prepare the conffile for removal from the system.
  630.   # We defer actual deletion until the package is configured so that we can
  631.   # roll this operation back if package installation fails. Otherwise copy it
  632.   # to newfilename and let dpkg handle it through conffiles mechanism.
  633.   #
  634.   # Call this function from a preinst script in the event $1 is "upgrade" or
  635.   # "install" and verify $2 to ensure the package is being upgraded from a
  636.   # version (or installed over a version removed-but-not-purged) prior to the
  637.   # one in which the conffile was obsoleted.
  638.  
  639.   local conffile current_checksum
  640.  
  641.   # validate arguments
  642.   if [ $# -lt 3 ]; then
  643.     usage_error "replace_conffile_with_symlink_prepare() called with wrong" \
  644.                 " number of arguments; expected at least 3, got $#"
  645.     exit $SHELL_LIB_USAGE_ERROR
  646.   fi
  647.  
  648.   oldconffile="$1"
  649.   shift
  650.   newconffile="$1"
  651.   shift
  652.  
  653.   remove_conffile_prepare "$_oldconffile" "$@"
  654.   # If $oldconffile still exists, then md5sums didn't match.
  655.   # Copy it to new one.
  656.   if [ -f "$oldconffile" ]; then
  657.     cp "$oldconffile" "$newconffile"
  658.   fi
  659.  
  660. }
  661.  
  662. replace_conffile_with_symlink_commit () {
  663.   # syntax: replace_conffile_with_symlink_commit oldfilename
  664.   #
  665.   # Complete the removal of a conffile "oldfilename" that has been
  666.   # replaced by a symlink.
  667.   #
  668.   # Call this function from a postinst script after having used
  669.   # replace_conffile_with_symlink_prepare() in the preinst.
  670.  
  671.   local conffile
  672.  
  673.   # validate arguments
  674.   if [ $# -ne 1 ]; then
  675.     usage_error "replace_conffile_with_symlink_commit() called with wrong" \
  676.                 "number of arguments; expected 1, got $#"
  677.     exit $SHELL_LIB_USAGE_ERROR
  678.   fi
  679.  
  680.   conffile="$1"
  681.  
  682.   remove_conffile_commit "$conffile"
  683. }
  684.  
  685. replace_conffile_with_symlink_rollback () {
  686.   # syntax: replace_conffile_with_symlink_rollback oldfilename newfilename
  687.   #
  688.   # Roll back the replacing of a conffile "oldfilename" with symlink to
  689.   # "newfilename".
  690.   #
  691.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  692.   # or "abort-install" and verify $2 to ensure the package failed to upgrade
  693.   # from a version (or install over a version removed-but-not-purged) prior
  694.   # to the one in which the conffile was obsoleted.
  695.   # You should have  used replace_conffile_with_symlink_prepare() in the
  696.   # preinst.
  697.  
  698.   local conffile
  699.  
  700.   # validate arguments
  701.   if [ $# -ne 2 ]; then
  702.     usage_error "replace_conffile_with_symlink_rollback() called with wrong" \
  703.                 "number of arguments; expected 2, got $#"
  704.     exit $SHELL_LIB_USAGE_ERROR
  705.   fi
  706.  
  707.   oldconffile="$1"
  708.   newconffile="$2"
  709.  
  710.   remove_conffile_rollback "$_oldconffile"
  711.   if [ -f "$newconffile" ]; then
  712.     rm "$newconffile"
  713.   fi
  714. }
  715.  
  716. run () {
  717.   # syntax: run command [ argument ... ]
  718.   #
  719.   # Run specified command with optional arguments and report its exit status.
  720.   # Useful for commands whose exit status may be nonzero, but still acceptable,
  721.   # or commands whose failure is not fatal to us.
  722.   #
  723.   # NOTE: Do *not* use this function with db_get or db_metaget commands; in
  724.   # those cases the return value of the debconf command *must* be checked
  725.   # before the string returned by debconf is used for anything.
  726.  
  727.   local retval
  728.  
  729.   # validate arguments
  730.   if [ $# -lt 1 ]; then
  731.     usage_error "run() called with wrong number of arguments; expected at" \
  732.                 "least 1, got $#"
  733.     exit $SHELL_LIB_USAGE_ERROR
  734.   fi
  735.  
  736.   "$@" || retval=$?
  737.  
  738.   if [ ${retval:-0} -ne 0 ]; then
  739.     observe "command \"$*\" exited with status $retval"
  740.   fi
  741. }
  742.  
  743. register_x_lib_dir_with_ld_so () {
  744.   # syntax: register_x_lib_dir_with_ld_so
  745.   #
  746.   # Configure the dynamic loader ld.so to search /usr/X11R6/lib for shared
  747.   # libraries.
  748.   #
  749.   # Call this function from the postinst script of a package that places a
  750.   # shared library in /usr/X11R6/lib, before invoking ldconfig.
  751.  
  752.   local dir ldsoconf
  753.  
  754.   dir="/usr/X11R6/lib"
  755.   ldsoconf="/etc/ld.so.conf"
  756.  
  757.   # is the line not already present?
  758.   if ! fgrep -qsx "$dir" "$ldsoconf"; then
  759.     observe "adding $dir directory to $ldsoconf"
  760.     echo "$dir" >> "$ldsoconf"
  761.   fi
  762. }
  763.  
  764. deregister_x_lib_dir_with_ld_so () {
  765.   # syntax: deregister_x_lib_dir_with_ld_so
  766.   #
  767.   # Configure dynamic loader ld.so to not search /usr/X11R6/lib for shared
  768.   # libraries, if and only if no shared libaries remain there.
  769.   #
  770.   # Call this function from the postrm script of a package that places a shared
  771.   # library in /usr/X11R6/lib, in the event "$1" is "remove", and before
  772.   # invoking ldconfig.
  773.  
  774.   local dir ldsoconf fgrep_status cmp_status
  775.  
  776.   dir="/usr/X11R6/lib"
  777.   ldsoconf="/etc/ld.so.conf"
  778.  
  779.   # is the line present?
  780.   if fgrep -qsx "$dir" "$ldsoconf"; then
  781.     # are there any shared objects in the directory?
  782.     if [ "$(echo "$dir"/lib*.so.*.*)" = "$dir/lib*.so.*.*" ]; then
  783.       # glob expansion produced nothing, so no shared libraries are present
  784.       observe "removing $dir directory from $ldsoconf"
  785.       # rewrite the file (very carefully)
  786.       set +e
  787.       fgrep -svx "$dir" "$ldsoconf" > "$ldsoconf.dpkg-tmp"
  788.       fgrep_status=$?
  789.       set -e
  790.       case $fgrep_status in
  791.         0|1) ;; # we don't actually care if any lines matched or not
  792.         *) die "error reading \"$ldsoconf\"; fgrep exited with status" \
  793.           "$fgrep_status" ;;
  794.       esac
  795.       set +e
  796.       cmp -s "$ldsoconf.dpkg-tmp" "$ldsoconf"
  797.       cmp_status=$?
  798.       set -e
  799.       case $cmp_status in
  800.         0) rm "$ldsoconf.dpkg-tmp" ;; # files are identical
  801.         1) mv "$ldsoconf.dpkg-tmp" "$ldsoconf" ;; # files differ
  802.         *) die "error comparing \"$ldsoconf.dpkg-tmp\" to \"$ldsoconf\";" \
  803.           "cmp exited with status $cmp_status" ;;
  804.       esac
  805.     fi
  806.   fi
  807. }
  808.  
  809. make_symlink_sane () {
  810.   # syntax: make_symlink_sane symlink target
  811.   #
  812.   # Ensure that the symbolic link symlink exists, and points to target.
  813.   #
  814.   # If symlink does not exist, create it and point it at target.
  815.   #
  816.   # If symlink exists but is not a symbolic link, back it up.
  817.   #
  818.   # If symlink exists, is a symbolic link, but points to the wrong location, fix
  819.   # it.
  820.   #
  821.   # If symlink exists, is a symbolic link, and already points to target, do
  822.   # nothing.
  823.   #
  824.   # This function wouldn't be needed if ln had an -I, --idempotent option.
  825.  
  826.   # Validate arguments.
  827.   if [ $# -ne 2 ]; then
  828.     usage_error "make_symlink_sane() called with wrong number of arguments;" \
  829.       "expected 2, got $#"
  830.     exit $SHELL_LIB_USAGE_ERROR
  831.   fi
  832.  
  833.   # We could just use the positional parameters as-is, but that makes things
  834.   # harder to follow.
  835.   local symlink target
  836.  
  837.   symlink="$1"
  838.   target="$2"
  839.  
  840.   if [ -L "$symlink" ] && [ "$(readlink "$symlink")" = "$target" ]; then
  841.       observe "link from $symlink to $target already exists"
  842.   else
  843.     observe "creating symbolic link from $symlink to $target"
  844.     mkdir -p "${target%/*}" "${symlink%/*}"
  845.     ln -s -b -S ".dpkg-old" "$target" "$symlink"
  846.   fi
  847. }
  848.  
  849. migrate_dir_to_symlink () {
  850.   # syntax: migrate_dir_to_symlink old_location new_location
  851.   #
  852.   # Per Debian Policy section 6.5.4, "A directory will never be replaced by a
  853.   # symbolic link to a directory or vice versa; instead, the existing state
  854.   # (symlink or not) will be left alone and dpkg will follow the symlink if
  855.   # there is one."
  856.   #
  857.   # We have to do it ourselves.
  858.   #
  859.   # This function moves the contents of old_location, a directory, into
  860.   # new_location, a directory, then makes old_location a symbolic link to
  861.   # new_location.
  862.   #
  863.   # old_location need not exist, but if it does, it must be a directory (or a
  864.   # symlink to a directory).  If it is not, it is backed up.  If new_location
  865.   # exists already and is not a directory, it is backed up.
  866.   #
  867.   # This function should be called from a package's preinst so that other
  868.   # packages unpacked after this one --- but before this package's postinst runs
  869.   # --- are unpacked into new_location even if their payloads contain
  870.   # old_location filespecs.
  871.  
  872.   # Validate arguments.
  873.   if [ $# -ne 2 ]; then
  874.     usage_error "migrate_dir_to_symlink() called with wrong number of"
  875.                 "arguments; expected 2, got $#"
  876.     exit $SHELL_LIB_USAGE_ERROR
  877.   fi
  878.  
  879.   # We could just use the positional parameters as-is, but that makes things
  880.   # harder to follow.
  881.   local new old
  882.  
  883.   old="$1"
  884.   new="$2"
  885.  
  886.   # Is old location a symlink?
  887.   if [ -L "$old" ]; then
  888.     # Does it already point to new location?
  889.     if [ "$(readlink "$old")" = "$new" ]; then
  890.       # Nothing to do; migration has already been done.
  891.       observe "migration of $old to $new already done"
  892.       return 0
  893.     else
  894.       # Back it up.
  895.       warn "backing up symbolic link $old as $old.dpkg-old"
  896.       mv -b "$old" "$old.dpkg-old"
  897.     fi
  898.   fi
  899.  
  900.   # Does old location exist, but is not a directory?
  901.   if [ -e "$old" ] && ! [ -d "$old" ]; then
  902.       # Back it up.
  903.       warn "backing up non-directory $old as $old.dpkg-old"
  904.       mv -b "$old" "$old.dpkg-old"
  905.   fi
  906.  
  907.   observe "migrating $old to $new"
  908.  
  909.   # Is new location a symlink?
  910.   if [ -L "$new" ]; then
  911.     # Does it point the wrong way, i.e., back to where we're migrating from?
  912.     if [ "$(readlink "$new")" = "$old" ]; then
  913.       # Get rid of it.
  914.       observe "removing symbolic link $new which points to $old"
  915.       rm "$new"
  916.     else
  917.       # Back it up.
  918.       warn "backing up symbolic link $new as $new.dpkg-old"
  919.       mv -b "$new" "$new.dpkg-old"
  920.     fi
  921.   fi
  922.  
  923.   # Does new location exist, but is not a directory?
  924.   if [ -e "$new" ] && ! [ -d "$new" ]; then
  925.     warn "backing up non-directory $new as $new.dpkg-old"
  926.     mv -b "$new" "$new.dpkg-old"
  927.   fi
  928.  
  929.   # Create new directory if it does not yet exist.
  930.   if ! [ -e "$new" ]; then
  931.     observe "creating $new"
  932.     mkdir -p "$new"
  933.   fi
  934.  
  935.   # Copy files in old location to new location.  Back up any filenames that
  936.   # already exist in the new location with the extension ".dpkg-old".
  937.   observe "copying files from $old to $new"
  938.   if ! (cd "$old" && cp -a -b -S ".dpkg-old" . "$new"); then
  939.     die "error(s) encountered while copying files from $old to $new"
  940.   fi
  941.  
  942.   # Remove files at old location.
  943.   observe "removing $old"
  944.   rm -r "$old"
  945.  
  946.   # Create symlink from old location to new location.
  947.   make_symlink_sane "$old" "$new"
  948. }
  949.  
  950. # vim:set ai et sw=2 ts=2 tw=80:
  951.  
  952. # GOBSTOPPER: The X Strike Force shell library ends here.
  953.  
  954. case "$1" in
  955. configure)
  956.   if dpkg --compare-versions "$2" lt-nl "1:7.4~2ubuntu1"; then
  957.     remove_conffile_commit "/etc/X11/Xsession.d/20xorg-common_process-args"
  958.     remove_conffile_commit "/etc/X11/Xsession.d/30xorg-common_xresources"
  959.     remove_conffile_commit "/etc/X11/Xsession.d/50xorg-common_determine-startup"
  960.     remove_conffile_commit "/etc/X11/Xsession.d/90xorg-common_ssh-agent"
  961.     remove_conffile_commit "/etc/X11/Xsession.d/99xorg-common_start"
  962.   fi
  963. esac
  964.  
  965. # register this package as a (potential) handler of the X server wrapper
  966. # config file
  967. if ! fgrep -qsx "$THIS_PACKAGE" "$XWRAPPER_CONFIG_ROSTER"; then
  968.   echo "$THIS_PACKAGE" >> "$XWRAPPER_CONFIG_ROSTER"
  969. fi
  970.  
  971. if ! [ -d "$CONFIG_AUX_DIR" ]; then
  972.   mkdir --mode=755 --parents "$CONFIG_AUX_DIR"
  973. fi
  974.  
  975. # dir -> symlink transition
  976. if ! [ -L "/usr/bin/X11" ] && [ -d "/usr/bin/X11" ]; then
  977.   # we accidentally created this link in the past
  978.   rm -f /usr/bin/X11/bin
  979.  
  980.   if ! rmdir /usr/bin/X11 2>/dev/null; then
  981.     echo "/usr/bin/X11 still contains files (are they locally installed?)"
  982.     echo ""
  983.     echo "Please examine the following list and either delete these"
  984.     echo "files, or relocate them to /usr/bin, then reinstall x11-common:"
  985.     echo "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"
  986.     ls -1 /usr/bin/X11/*
  987.     echo "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"
  988.     exit 1
  989.   else
  990.     ln -s ../bin /usr/bin/X11 || true
  991.   fi
  992. fi
  993.  
  994.  
  995. # only mess with config file it exists; otherwise, assume that's the way the
  996. # user wants it, but only if upgrading
  997. if [ -e "$XWRAPPER_CONFIG" ] || [ -z "$UPGRADE" ]; then
  998.   # similarly, check for the existence of the checksum file; if it doesn't
  999.   # exist, assume that's the way the user wants it, but only if upgrading
  1000.   if [ -e "$XWRAPPER_CONFIG_CHECKSUM" ] || [ -z "$UPGRADE" ]; then
  1001.     # next, compare the current and stored checksums; if they do not match,
  1002.     # assume that's the way the user wants it ... upgrading etc
  1003.     if [ "$(md5sum "$XWRAPPER_CONFIG" 2>/dev/null)" = \
  1004.          "$(cat "$XWRAPPER_CONFIG_CHECKSUM" 2>/dev/null)" ] || \
  1005.         [ -z "$UPGRADE" ]; then
  1006.       # they match; prepare a new version of the config file
  1007.       ALLOWED_USERS=
  1008.       if db_get x11-common/xwrapper/actual_allowed_users; then
  1009.         ALLOWED_USERS="$RET"
  1010.       fi
  1011.       NICE_VALUE=
  1012.       if db_get x11-common/xwrapper/nice_value; then
  1013.         NICE_VALUE="$RET"
  1014.       fi
  1015.       if [ -n "$ALLOWED_USERS" ] && [ -n "$NICE_VALUE" ]; then
  1016.         NEW_XWRAPPER_CONFIG=$(tempfile)
  1017.         cat >>"$NEW_XWRAPPER_CONFIG" << EOF
  1018. # Xwrapper.config (Debian X Window System server wrapper configuration file)
  1019. #
  1020. # This file was generated by the post-installation script of the x11-common
  1021. # package using values from the debconf database.
  1022. #
  1023. # See the Xwrapper.config(5) manual page for more information.
  1024. #
  1025. # This file is automatically updated on upgrades of the x11-common package
  1026. # *only* if it has not been modified since the last upgrade of that package.
  1027. #
  1028. # If you have edited this file but would like it to be automatically updated
  1029. # again, run the following command as root:
  1030. #   dpkg-reconfigure x11-common
  1031. allowed_users=$ALLOWED_USERS
  1032. nice_value=$NICE_VALUE
  1033. EOF
  1034.         if ! cmp -s "$XWRAPPER_CONFIG" "$NEW_XWRAPPER_CONFIG"; then
  1035.           cp "$NEW_XWRAPPER_CONFIG" "$XWRAPPER_CONFIG.dpkg-new"
  1036.           mv "$XWRAPPER_CONFIG.dpkg-new" "$XWRAPPER_CONFIG"
  1037.           md5sum "$XWRAPPER_CONFIG" > "$XWRAPPER_CONFIG_CHECKSUM"
  1038.         fi
  1039.         rm -f "$NEW_XWRAPPER_CONFIG"
  1040.       else
  1041.         observe "not updating $XWRAPPER_CONFIG; problems communicating" \
  1042.                 "with debconf database"
  1043.       fi
  1044.     else
  1045.       observe "not updating $XWRAPPER_CONFIG; file has been customized"
  1046.     fi
  1047.   else
  1048.     observe "not updating $XWRAPPER_CONFIG; no stored checksum available"
  1049.   fi
  1050. else
  1051.   observe "not updating $XWRAPPER_CONFIG; file does not exist"
  1052. fi
  1053.  
  1054. # Clean up my idiocy
  1055. if [ -n "$2" ] && dpkg --compare-versions "$2" eq "1:7.0.16"; then
  1056.   if [ -e "/etc/X11/Xsession.xfree86" ] && [ ! -e "/etc/X11/Xsession" ]; then
  1057.     mv "/etc/X11/Xsession.xfree86" "/etc/X11/Xsession"
  1058.   fi
  1059. fi
  1060.  
  1061. # Automatically added by dh_installinit
  1062. if [ -x "/etc/init.d/x11-common" ]; then
  1063.     update-rc.d x11-common start 70 S . >/dev/null
  1064.     if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
  1065.         invoke-rc.d x11-common start || exit $?
  1066.     else
  1067.         /etc/init.d/x11-common start || exit $?
  1068.     fi
  1069. fi
  1070. # End automatically added section
  1071.  
  1072.  
  1073. exit 0
  1074.  
  1075. # vim:set ai et sts=2 sw=2 tw=80:
  1076.